LaTeX
Thứ Tư, 05/07/2017, 00:07
Tikz package - [Kỳ 4] Thực hành TikZ qua hình vẽ thực tế

Tikz package - [Kỳ 4] Thực hành TikZ qua hình vẽ thực tế

Bài viết này TEXmath sẽ trình bày từ đầu đến cuối cách vẽ một số hình cụ thể (phía dưới). Có thể những hình vẽ này không liên quan đến chuyên ngành của bạn, nhưng qua việc theo dõi các bước vẽ, mong rằng có thể giúp bạn đọc học được một vài thủ thuật hữu ích khi phân tích và vẽ hình với TikZ.
 
Xem lại các kỳ trước : Bài 1 | Bài 2 | Bài 3
 
notion image
 

Chọn hệ trục tọa độ và thứ tự vẽ

Để đơn giản, ta vẽ hình màu tím trước và chọn hệ trục sao cho điểm gốc O nằm ở ngày 31. Như vậy có thể ước lượng được hình vẽ sẽ nằm trong khoảng . Ta sẽ chọn khoảng cách giữa các cột là 1cm, khoảng cách giữa các hàng là 0.7cm. Chọn thứ tự vẽ các thành phần cũng quan trọng. Chúng ta sẽ chọn vẽ theo thứ tự sau
  1. Các ngàythứ
      • Ta vẽ hết các ngày vào đúng vị trí
      • Sau đó mới vẽ đè lên các ngày có khoanh tròn
  1. Màu nền tím và Khung viền
  1. Số 28 và "Friday March 2014"
  1. Hai dấu chuyển ngày
  1. Một số hiệu chỉnh

Bắt đầu vẽ

Vẽ các ngày và thứ

Ta vẽ dòng dưới cùng trước. Ở đây ta dùng \foreach  cho các ngày có cách vẽ giống nhau
\begin{tikzpicture} \draw (0,0) node{31}; \foreach \ngay in {1,2,3,4,5,6} \draw (\ngay,0) node[gray]{\ngay}; \end{tikzpicture}
Tiếp theo ta vẽ các dòng từ 2 đến 5 (từ dưới lên) bằng cách thêm vào các câu lệnh như sau
notion image
\foreach \ngay in {24,25,26,27,28,29,30} \draw (\ngay-24,0.7) node{\ngay}; \foreach \ngay in {17,18,19,20,21,22,23} \draw (\ngay-17,1.4) node{\ngay}; \foreach \ngay in {10,11,12,13,14,15,16} \draw (\ngay-10,2.1) node{\ngay}; \foreach \ngay in {3,4,5,6,7,8,9} \draw (\ngay-3,2.8) node{\ngay};
Các bạn chú ý phép trừ trong tọa độ các điểm, chúng giúp các điểm tịnh tiến lại đúng vị trí mình mong muốn. Tiếp theo, vẽ thêm dòng đầu tiên của calendar bằng các lệnh sau
notion image
\foreach \ngay in {24,25,26,27,28} \draw (\ngay-24,3.5) node[gray]{\ngay}; \draw (5,3.5) node{1}; \draw (6,3.5) node{2};
Bây giờ ta vẽ đến các thứ. Ta cũng dùng vòng lặp \foreach  nhưng lần này sẽ dùng 2 biến là \toado  (tọa độ) và \thu (thứ)
notion image
\foreach \toado / \thu in {0/Mo, 1/Tu, 2/We, 3/Th, 4/Fr, 5/Sa, 6/Su} \draw (\toado,4.2) node[violet]{\thu};
Vẽ các ngày khoanh tròn. Các ngày này có cách vẽ giống nhau, nhưng lại không có vị trí theo quy luật nên không dùng \foreach được. Do đó chúng ta vẽ mỗi ngày khoanh tròn bằng mỗi câu lệnh. Ví dụ ngày 28 có tọa độ là (4,0.7) ta vẽ như sau
notion image
\fill [orange] (4,0.7) circle(3mm) node[white]{28};
 
Ở đây ta dùng \fill để tạo mảng màu (không có viền) là một hình tròn bán kình 3mm Những ngày khoanh tròn còn lại bạn vẽ hoàn toàn tương tự nhé
notion image
 

Vẽ màu nền tím

Ta sẽ dùng lệnh vẽ hình chữ nhật (rectangle) để vẽ vùng màu tím, do đó ta cần ước lượng tọa độ hai góc dưới-trái và trên-phải (sau khi vẽ nếu chưa vừa ý có thể tinh chỉnh lại). Thêm vào khối lệnh của chúng ta câu lệnh sau
\fill [violet] (-0.8,4.9) rectangle (6.8,10.5);
 
Tiếp theo ta vẽ khung viền bên ngoài. Để ý là hai góc trên của vùng màu tím cần phải cua tròn, do đó ta sẽ vẽ khung viền có góc tròn và đè lên vùng màu tím. Ta dùng lệnh vẽ có clip (cắt xén) như sau
notion image
\draw [clip,rounded corners=8pt] (-0.8,-0.5) rectangle (6.8,10.5);
 
Bạn phải đặt câu lệnh clip ở trước câu lệnh bị cắt (lệnh tạo vùng màu tím), điều này đã nói ở bài viết trước. Khi đó bạn sẽ được hình vẽ như thế này
notion image
 

Số 28 và "Friday March 2014"

Bước này chỉ cần ước lượng tọa độ của điểm cần đặt node
\draw (1,7.7) node[white]{\fontsize{70pt}{1.2}\selectfont 28}; \draw (1,9.1) node[white]{\fontsize{16pt}{1.2}\selectfont March 2017}; \draw (1,9.7) node[white]{\fontsize{16pt}{1.2}\selectfont Friday};
 
Ở đây ta dùng lệnh \fontsize{70pt}{1.2}\selectfont để cài đặt font-size 70pt, dãn dòng 1.2 Font chữ chưa giống hoàn toàn hình ta cần vẽ.  Chúng ta sẽ hiệu chỉnh ở phần cuối.
 
notion image

Vẽ 2 nút chuyển ngày

Các bạn đã biết cách vẽ 2 đoạn thẳng liên tiếp ở bài viết trước. Do đó ở bước này ta chỉ cần chọn tọa độ các điểm cho hợp lí và vẽ các đoạn thẳng
\draw [white, thick] (5.1,9.9) -- (5,9.7) -- (5.1,9.5); \draw [white, thick] (5.9,9.9) -- (6,9.7) -- (5.9,9.5);
 
Đến đây ta đã hoàn thành 90% công việc rồi. Để hoàn thiện hình vẽ ta làm thêm một số hiệu chỉnh
notion image
 

Hiệu chỉnh

Chúng ta sẽ thay đổi font cho các node bằng cách đặt lệnh sau vào ngay sau lệnh \begin{tikzpicture}
\tikzset{every node/.append style={font=\sffamily}};
 
Nếu bạn thích, bạn có thể làm nhạt thêm các ngày của tháng 2 và tháng 4 bằng cách thêm !50 vào sau gray. Và đây là kết quả sau khi thay đổi màu sắc
notion image
notion image
notion image
notion image
notion image
notion image
\documentclass[a4paper]{report} \usepackage{tikz} \begin{document} \begin{tikzpicture} \tikzset{every node/.append style={font=\sffamily}}; \foreach \ngay in {3,4,5,6,7,8,9} \draw (\ngay-3,0) node[gray!50]{\ngay}; \foreach \ngay in {26,27,28,29,30} \draw (\ngay-26,0.7) node{\ngay}; \foreach \ngay in {1,2} \draw (\ngay+4,0.7) node[gray!50]{\ngay}; \foreach \ngay in {19,20,21,22,23,24,25} \draw (\ngay-19,1.4) node{\ngay}; \foreach \ngay in {12,13,14,15,16,17,18} \draw (\ngay-12,2.1) node{\ngay}; \foreach \ngay in {5,6,7,8,9,10,11} \draw (\ngay-5,2.8) node{\ngay}; \foreach \ngay in {1,2,3,4} \draw (\ngay+2,3.5) node{\ngay}; \foreach \ngay in {29,30,31} \draw (\ngay-29,3.5) node[gray!50]{\ngay}; \foreach \vitri / \thu in {0/Mo, 1/Tu, 2/We, 3/Th, 4/Fr, 5/Sa, 6/Su} \draw (\vitri,4.2) node[magenta]{\thu}; \fill [magenta] (5,1.4) circle(3mm) node[white]{24}; \draw [clip,rounded corners=8pt] (-0.8,-0.5) rectangle (6.8,10.5); \fill [magenta!70] (-0.8,4.9) rectangle (6.8,10.5); \draw (1,7.7) node[white]{\fontsize{70pt}{1.2}\selectfont 24}; \draw (1,9.1) node[white]{\fontsize{16pt}{1.2}\selectfont November 2017}; \draw (1,9.7) node[white]{\fontsize{16pt}{1.2}\selectfont Friday}; \draw [white, thick] (5.1,9.9) -- (5,9.7) -- (5.1,9.5); \draw [white, thick] (5.9,9.9) -- (6,9.7) -- (5.9,9.5); \end{tikzpicture} \end{document}

Kết

Như đã nói ở lúc đầu, có thể hình vẽ chẳng liên quan đến chuyên ngành của bạn, nhưng qua thông qua bài viết này hy vọng có thể giúp bạn hình dung được các bước vẽ một hình trong TikZ như thế nào. Bài viết tiếp theo TEXmath sẽ cố gắng giới thiệu đến các bạn những thủ thuật thiết thực khác, những hình vẽ phức tạp hơn một chút.
 
Cùng chủ đề